#ifndef __M_ONLINE_H__
#define __M_ONLINE_H__
#include "util.hpp"
#include <mutex>
#include <unordered_map>

class online_manager
{
private:
    //用于建立游戏大厅中用户id与通信连接的关系
    std::unordered_map<uint64_t,wsserver_t::connection_ptr> _hall_user;
    //用于建立游戏房间中用户id与通信连接的关系
    std::unordered_map<uint64_t,wsserver_t::connection_ptr> _room_user;
    std::mutex _mutex;
public:
    /*当websocket长连接成功建立后，调用这个函数，将用户的uid与其连接加入到游戏大厅中*/
    void enter_game_hall(uint64_t uid,wsserver_t::connection_ptr &conn)
    {
        std::unique_lock<std::mutex> lock(_mutex);
        _hall_user.insert(std::make_pair(uid,conn));
    }

    /*当websocket长连接成功建立后，调用这个函数，将用户的uid与其连接加入到游戏大厅中*/
    void enter_game_room(uint64_t uid,wsserver_t::connection_ptr& conn)
    {
        std::unique_lock<std::mutex> lock(_mutex);
        _room_user.insert(std::make_pair(uid,conn));
    }

    /*当websocket长连接断开后，需要调用这个函数，将用户和它的连接从游戏大厅中移除*/
    void exit_game_hall(uint64_t uid)
    {
        std::unique_lock<std::mutex> lock(_mutex);
        /*当uid被移除，对应的conn也就没有了相映射的关系，就会计数器--变成0，就会自动销毁*/
        _hall_user.erase(uid); 
    }
    /*当websocket长连接断开后，需要调用这个函数，将用户和它的连接从游戏房间中移除*/
    void exit_game_room(uint64_t uid)
    {
        std::unique_lock<std::mutex> lock(_mutex);
        /*当uid被移除，对应的conn也就没有了相映射的关系，就会计数器--变成0，就会自动销毁*/
        _room_user.erase(uid); 
    }

    /*判断指定用户是否在游戏大厅中*/
    bool is_in_game_hall(uint64_t uid)
    {
        std::unique_lock<std::mutex> lock(_mutex);
        auto it = _hall_user.find(uid);
        if(it ==_hall_user.end())
        {
            return false;
        }
        return true;
    }

    /*判断指定用户是否在游戏房间中*/
    bool is_in_game_room(uint64_t uid)
    {
        std::unique_lock<std::mutex> lock(_mutex);
        auto it = _room_user.find(uid);
        if(it ==_room_user.end())
        {
            return false;
        }
        return true;
    }

    /*通过用户id，获取对应的游戏大于的通信连接*/
    wsserver_t::connection_ptr get_conn_from_hall(uint64_t uid)
    {
        std::unique_lock<std::mutex> lock(_mutex);
        auto it = _hall_user.find(uid);
        if(it==_hall_user.end())
        {
            return wsserver_t::connection_ptr();
        }
        return it->second;
    }

    /*通过用户id，获取对应的游戏房间的通信连接*/
    wsserver_t::connection_ptr get_conn_from_room(uint64_t uid)
    {
        std::unique_lock<std::mutex> lock(_mutex);
        auto it = _room_user.find(uid);
        if(it==_room_user.end())
        {
            return wsserver_t::connection_ptr();
        }
        return it->second;
    }

};
#endif